package com.leecode.base;

/**
 * @Author: yaoshubin
 * @Date: 2022-12-06 21:47
 * @description :
 * <p>
 * <p>
 * 位运算核心
 * <p>
 * 1) 利用位&运算符计算： num 的32 位信息
 * <p>
 * 2) int 范围 -2^31 ~ 2^31 - 1   ，其中最高位为符号位 ， 负数计算 = 最高位1（除符号位，其实除不除都行）  + （按取反+1）
 * <p>
 * 3）想： 如何表示 -1 的32位数？
 */
public class Index_01_位运算 {

    public static void main(String[] args) {

        //int num = 4;

        //  -2 ^ 31 ~ 2^31 - 1
        //int num = Integer.MAX_VALUE;
        //int num = Integer.MIN_VALUE;

        int num = -1;


      /*  print(num);
        print(num >> 1);   //  带符号右移，用1补
        print(num >>> 3);   // 不带符号右移，用0补*/


        int a = Integer.MIN_VALUE;
        int b = -a;
        int c = ~a + 1;

        print(a);
        print(b);
        print(c);

    /*    print(a | b);
        print(a & b);
        print(~b);
        print(a ^ b);*/


        // -N = ~N+1


    }

    /**
     * 实际上就是按位输出，只是num  取决于（1<<i）
     * 举例
     * 00000000000000000000000000000100
     * &   00000000000010000000000000000000
     * --------------------------------------
     * 00000000000000000000000000000100
     *
     * @param num
     */
    public static void print(int num) {
        for (int i = 31; i >= 0; i--) {
            System.out.print((num & (1 << i)) == 0 ? "0" : "1");
        }
        System.out.println();
    }
}
